﻿#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <vector>
#include "generatePoints.h"
#include "force.h"
#include <sstream>
#include <cmath>
#include <algorithm>
#include <fstream>
#include "divide.h"
#include "utils.h"
#include <chrono>

using namespace std;
using namespace chrono;

struct Point{
    int x;
    int y;
};
// 生成随机点
//int main() {
//    int n = 100000;
//    generateRandomPoints(n);
//    printf("%d 个随机不重复的点已保存到 random_points_%d.txt 文件中。\n", n, n);
//    return 0;
//}


// 获取凸包
int main() {

    int n = 10000; // 假设有n个点
    vector<Point> points(n);

    // 从文件中读取点的数量和坐标并填充到点数组中
    ifstream file("random_points_10000.txt");
    if (!file.is_open()) {
        cerr << "File open error" << endl;
        return 1;
    }

    for (int i = 0; i < n; i++) {
        if (!(file >> points[i].x >> points[i].y)) {
            cerr << "File read error" << endl;
            file.close();
            return 1;
        }
    }

    file.close();
//    // 获取当前时间点（开始时间）
//    auto start_force = high_resolution_clock::now();

    vector<Point> convexHull_force = convexHullBySlope(points);

//    // 获取当前时间点（结束时间）
//    auto stop_force = high_resolution_clock::now();
//
//    // 计算执行时间
//    auto duration_force = duration_cast<milliseconds>(stop_force - start_force);
//
//    // 输出执行时间
//    cout << "force Algorithm execution time: " << duration_force.count() << " milliseconds" << endl;

//    // 获取当前时间点（开始时间）
//    auto start_divided = high_resolution_clock::now();
//    vector<Point> convexHull_divide = dividedConvexHull(points);
//
//    // 获取当前时间点（结束时间）
//    auto stop_divided = high_resolution_clock::now();
//
//    // 计算执行时间
//    auto duration_divided = duration_cast<milliseconds>(stop_divided - start_divided);
//
//    // 输出执行时间
//    cout << "divided Algorithm execution time: " << duration_divided.count() << " milliseconds" << endl;

//    // 将凸包保存到文件中
//    savePointsToFile(convexHull_force, "convex_hull_force.txt");
//    savePointsToFile(convexHull_divide, "convex_hull_divide.txt");
//
//    // 打印凸包的点
//    cout << "Force: " <<convexHull_force.size()<<endl;
//    for (const Point& point : convexHull_force) {
//        printPoint(point);
//    }
//    cout << endl;

//    cout << "Divide: " <<convexHull_divide.size()<<endl;
//    for (const Point& point : convexHull_divide) {
//        printPoint(point);
//    }
//    cout << endl;

    return 0;
}